/*******************************************************************************
 * 版权：北京润尼尔网络科技有限公司，保留所有版权<br>
 * 版本：v1.0.0<br>
 * 文件：OpenExprimentDialog.js<br>
 * 日期：2017年7月14日<br>
 * 作者: 杨顺强<br>
 * 功能：打开实验脚本，显示在实验台上<br>
 *
 * 修改记录：<br>
 * 日期 描述 更新功能<br>
 *
 ******************************************************************************/
window.makeNamespace(window, 'Rainier.UI.V2')

Rainier.UI.V2.OpenExprimentDialog = Rainier.UI.V2.BaseDialog.extend({
  NAME: 'Rainier.UI.V2.OpenExprimentDialog',

  /**
   * @名称   init
   * @功能   初始化打开实验对话框
   * @author 杨顺强
   * @data   2017-07-15
   * @return {[type]}   [description]
   */
  init: function () {
    var _this = this
    var dialogProperties = {
      title: '打开实验',
      headerCls: '',
      width: 400,
      height: 300,
      closed: false,
      modal: true,
      bodyCls: 'app-dialog-body',
      iconCls: 'icon-edit',
      buttons: [
        {
          text: '打开',
          handler: function () {
            _this.onClickConfirm()
          },
        },
        {
          text: '取消',
          handler: function () {
            _this.onClickCancel()
          },
        },
      ],
    }

    this.expJsonObject = null
    this.comFileBox = null
    this.expInfoComponent = null
    this.contentFlag = true
    this.expName = ''

    this._super(dialogProperties)
  },

  /**
   * @名称   createDialogComponents
   * @功能   初始化对话框时，执行该函数
   * @author 杨顺强
   * @data   2017-07-15
   * @return {[type]}   [description]
   */
  createDialogComponents: function () {
    var layoutSupport = new Rainier.UI.V2.UICompositeLayoutSupport(this.dialog, { fit: true, border: false })
    var fileProperties = { region: 'north', height: 40, split: false }
    var fileLayout = new Rainier.UI.V2.UICompositeLayout(layoutSupport, fileProperties)

    var expProperties = { region: 'center', split: false }
    var expLayout = new Rainier.UI.V2.UICompositeLayout(layoutSupport, expProperties)

    var fileBoxProperties = { fit: true, buttonText: '打开实验', accept: '.ocj', mutiple: false }
    this.comFileBox = new Rainier.UI.V2.UICompositeFileBox(fileLayout, fileBoxProperties)

    var comPanel = new Rainier.UI.V2.UICompositePanel(expLayout, { fit: true })
    this.expInfoComponent = new Rainier.UI.V2.UICompositeTextBox(comPanel, {
      fit: true,
      editable: false,
      readonly: true,
      multiline: true,
      label: '实验基本信息:',
      labelPosition: 'top',
      labelAlign: 'left',
    })

    this.initComponentBusiness()
  },

  /**
   * @名称   initComponentBusiness
   * @功能   初始化组件之间的事件内容，完成对组件相应事件的监听
   * @author 杨顺强
   * @data   2017-07-15
   * @return {[type]}   [description]
   */
  initComponentBusiness: function () {
    var _this = this
    var ComFileBoxListener = Rainier.UI.V2.UIEventListener.extend({
      NAME: 'comFileBoxListener',

      init: function () {
        this._super()
      },

      onEvent: function (sEvent, objEventSource, objArgs) {
        var newValue = objArgs[0]
        var oldValue = objArgs[1]
        if (!newValue) {
          return //fileBox 内容为空，则直接返回
        }
        var fileName = newValue
        _this.refreshExpInfoComponentContent(fileName)
      },
    })

    this.comFileBox.registerEventListener('onChange', new ComFileBoxListener())
  },

  /**
   * @名称   refreshExpInfoComponentContent
   * @功能   filebox 内容发生改变时，更新comPanel的内容显示
   * @author 杨顺强
   * @data   2017-07-15
   * @param  {[String]}   fileName [fileBox 内部文件夹的名字]
   * @return {[type]}              [description]
   */
  refreshExpInfoComponentContent: function (fileName) {
    var _this = this
    var messageInfo = ''
    //第一种情况：文件后缀名字错误
    var reg = new RegExp('.ocj' + '$')
    var result = reg.test(fileName.toLowerCase())
    if (!result) {
      messageInfo = '请选择一个后缀名字为(.ocj)的文件！'
      this.expInfoComponent.getElement().textbox({
        iconCls: 'icon-no',
        iconAlign: 'right',
        prompt: messageInfo,
      })
      this.contentFlag = false
      return
    }

    _this.expName = fileName.substr(0, fileName.lastIndexOf('.'))
    var files = _this.comFileBox.getFiles()
    var expinfoString = ''

    var reader = new FileReader()
    reader.readAsText(files[0])
    reader.onload = function () {
      expinfoString = this.result
      try {
        _this.expJsonObject = JSON.parse(expinfoString)
        if (_this.expJsonObject.experimentInfo) {
          messageInfo = {}
          messageInfo['expName'] = _this.expJsonObject.experimentInfo.experimentName || '未知'
          messageInfo['description'] = '无'
          if (_this.expJsonObject.experimentInfo.description) {
            messageInfo['description'] = _this.expJsonObject.experimentInfo.description.text
              ? _this.expJsonObject.experimentInfo.description.text
              : '无'
          }
        }

        var messageString = new String() + '实验名称：' + messageInfo.expName + '\n' + '实验简介：' + messageInfo.description + '\n'

        _this.expInfoComponent.getElement().textbox({
          iconCls: 'icon-ok',
          iconAlign: 'right',
          prompt: messageString,
        })
        _this.contentFlag = true
        return true
      } catch (Error) {
        _this.expInfoComponent.getElement().textbox({
          iconCls: 'icon-no',
          iconAlign: 'right',
          prompt: '文件内容损坏，请选择其他实验文件',
        })
        _this.contentFlag = false
        return false
      }
    }
  },

  /**
   * @名称   handleOpenedExperiment
   * @功能   点击确定时，完成对实验脚本试验台回显处理
   * @author 杨顺强
   * @data   2017-07-15
   * @return {[type]}   [description]
   */
  handleOpenedExperiment: function () {
    if (!this.contentFlag) {
      window.alert('您选择的文件格式不正确，或者文件内容已损坏，请重新选择！')
      return false
    }
    //怎么恢复实验台
    //删除原来的实验内容
    var name = this.expName
    if (!this.expName) {
      name = this.comFileBox.getValue()
    }

    var context = window.app.getContext()
    context.setCurrentExperimentName(name)

    var activeEditor = context.getActiveEditor()

    //恢复当前实验平台；
    var rootModel = context.getActiveEditor().rootModel
    var simResult = rootModel.simResult
    simResult.clearPlot() //清空实验结果
    window.localStorage.clear() //清空本地缓存；
    var dialogs = window.app.dialogList ? window.app.dialogList : null //清空打开的对话框；
    if (dialogs && dialogs.getSize()) {
      while (dialogs.getSize() > 0) {
        dialogs.get(0).dialog.close()
      }
    }

    activeEditor.doRestore(this.expJsonObject)
    return true
  },

  /**
   * @名称   onClickCancle
   * @功能   点击关闭按钮时，完成对对话框的关闭操作
   * @author 杨顺强
   * @data   2017-07-15
   * @return {[type]}   [description]
   */
  onClickCancel: function () {
    this.dialog.close()
  },

  /**
   * @名称   onClickConfirm
   * @功能   点击确定时，完成对实验脚本的处理和对话框的处理
   * @author 杨顺强
   * @data   2017-07-15
   * @return {[type]}   [description]
   */
  onClickConfirm: function () {
    var isOpenSuccess = this.handleOpenedExperiment()
    if (isOpenSuccess) {
      this.dialog.close()
    }
  },
})
